package com.cskaoyan.javase.array._2memory;

/**
 *
 * 数组是典型的引用数据类型,通过数组的动态初始化,来详细的了解什么是引用数据类型
 * 数组中可以存储很多元素:
 *      如果是存储基本数据类型元素,那么就直接在数组对象中存储它的取值即可.
 *
 * @since 10:43
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo2 {
    public static void main(String[] args) {
        /*
            动态初始化一个int数组
            int[] arr = new int[3];
            上述语句,左边是数组的声明,右边是数组的初始化
            思考:
            arr是一个变量,是一个数组变量,从变量的类型上来说,它是一个什么变量?
            是一个局部变量,局部变量就存储在方法的栈帧中(JVM栈中)

            思考:
            右边数组的初始化,使用new关键字,表示在堆上创建数组的对象

            数组是典型的引用数据类型,通过数组的动态初始化,很明显,引用数据类型:
                1.引用数据类型变量的存储要分为两个部分
                2.在方法的栈帧中创建局部变量,存储数组的名字,称之为"数组的引用"
                    引用数据类型的引用,引用存储在栈上
                3.在堆上创建对象

            很明显对象才是引用数据类型的实质,但是我们不能直接访问实质
            而是必须通过栈上的引用间接的访问堆上的对象

            那么栈上的引用如何和堆上的对象产生联系呢? 为什么栈上的引用能够操作堆上的对象呢?
            栈上的引用是通过存储堆上对象的地址,和对象产生联系
            所以引用中就是存储了一个地址
         */
        int[] arr = new int[3];
        /*
            [I@1540e19d
            其中:
            [表示这是一个一维数组
            I表示这个一维数组是int类型
            @后面跟的是一个十六进制数
            这个十六进制数,
                可以近似的看成是引用指向的对象的一个地址值
         */
        System.out.println(arr);
        /*
            数组的动态初始化,元素具有默认值
            int类型数组的元素默认值就是0
         */
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);
        System.out.println(arr.length);
        arr[0] = 666;
        System.out.println(arr[0]);
        System.out.println(arr.length);
        System.out.println(arr);

        int num = 10;
        System.out.println(num);
    }
}
